package com.merry.transaction;

import java.io.Flushable;

/**
 * Interface for transaction synchronization callbacks.
 * Supported by AbstractPlatformTransactionManager.
 *
 * <p>TransactionSynchronization implementations can implement the Ordered interface
 * to influence their execution order. A synchronization that does not implement the
 * Ordered interface is appended to the end of the synchronization chain.
 *
 * <p>System synchronizations performed by Spring itself use specific order values,
 * allowing for fine-grained interaction with their execution order (if necessary).
 *
 * @author Juergen Hoeller
 * @since 02.06.2003
 * @see org.springframework.transaction.support.TransactionSynchronizationManager
 * @see AbstractPlatformTransactionManager
 * @see org.springframework.jdbc.datasource.DataSourceUtils#CONNECTION_SYNCHRONIZATION_ORDER
 */
public interface TransactionSynchronization extends Flushable {

    /** 提交的状态 */
    int STATUS_COMMITTED = 0;

    /** 回滚的状态 */
    int STATUS_ROLLED_BACK = 1;

    /** 事务状态未知 */
    int STATUS_UNKNOWN = 2;


    /**
     * 暂停当前事务，用于挂起线程，本质是将当前的线程与当前事务解绑。
     * Spring底层是移除这个对象的ThreadLocal。
     */
    default void suspend() {
    }

    /**
     * 恢复当前事务，将已经暂停的事务与当前的线程重新绑定。
     * Spring本质是将这个线程添加进 ThreadLocal。
     */
    default void resume() {
    }

    /**
     * Flush the underlying session to the datastore, if applicable:
     * for example, a Hibernate/JPA session.
     * @see org.springframework.transaction.TransactionStatus#flush()
     */
    @Override
    default void flush() {
    }


    /**
     * 在事务提交之前调用该方法。
     * 注意：不要在这里抛出 TransactionException 及其子类异常。
     */
    default void beforeCommit(boolean readOnly) {
    }

    /**
     * 在事务提交/回滚之前调用，可以在事务完成之前执行资源清理。
     * 注意：不要在这里抛出 TransactionException 及其子类异常。
     */
    default void beforeCompletion() {
    }

    /**
     * 事务提交后调用，可以在主事务成功提交后立即执行进一步的操作。
     * 注意：不要在这里抛出 TransactionException 及其子类异常。
     */
    default void afterCommit() {
    }

    /**
     * 在事务提交/回滚后调用。可以在事务完成后执行资源清理。
     * 注意：不要在这里抛出 TransactionException 及其子类异常。
     */
    default void afterCompletion(int status) {
    }

}
